给定仅包含“()[]{}”六种括号的字符串,请你判断该字符串中,括号的匹配是否是合法的,也就是对应括号的数量、嵌套顺序完全正确。。
输入格式:
第一行一个整数T(T<=10)
其后T行每行一个字符串只包含[{()}]六种字符(字符串长度2e5以内)
输出格式:
对于每个字符串,匹配输出Yes,否则输出No
输入样例:
输出样例:
思路
使用stack来存储符号,遇左压栈,如果为右括号判断是否与当前栈顶元素相匹配,若不匹配则为“No”,匹配则弹出当前栈顶元素(左括号),继续进行下一个括号匹配。最后为空栈则为“Yes”。
代码
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 
 | #include <iostream>#include <stack>
 using namespace std;
 bool com(char a, char b) {
 if ((a == '{' && b == '}') || (a == '[' && b == ']') || (a == '(' && b == ')'))
 return true;
 return false;
 }
 int main() {
 int n;
 cin >> n;
 getchar();
 for (int i = 0; i < n; i++) {
 stack<char> s;
 string m;
 getline(cin, m);
 for (int j = 0; j < m.size(); j++) {
 char c = m[ j ];
 if (!s.empty()) {
 if (com(s.top(), c)) {
 s.pop();
 continue;
 }
 }
 s.push(c);
 }
 if (!s.empty())
 cout << "No" << endl;
 else
 cout << "Yes" << endl;
 }
 }
 
 |